package comunicação.em.rede;

import classe.grafica.Chat;                                         //Importação da classe gráfica para prover um meio
import classes.gerais.Contato;                                      //Importação da classe contato para mostrar o caminho

public class Conexão {                                              //Classe que guarda dados da conexão entre máquina e outra, guarda dados vitais da conexão, dispara o envio de mensagens e mostra mensagens recebidas
    private Contato Meta;                                           //Meta - a meta da conexão
    private String Mensagem;                                        //Mensagem - esse item é variável, onde será guardada a última mensagem recebida                                     
    private Chat Meio;                                              //Meio - meio que utiliza a conexão
    private Servidor MServidor;                                     //MServidor - thread referente ao servidor 
    
    public Conexão (Contato Meta){                                      //Montador, recolhe dados necessários para estabelecer a conexão
        this.Meta = Meta;                                               //Seta o contato
        this.Mensagem = null;                                           //Seta a mensagem como null, no início da conexão não há nenhuma mensagem disponívela
        this.Meio = null;                                               //Não existe um meio específico
        this.MServidor = null;                                          //Ainda não existe servidor
        CanalRecebe();                                                  //Dispara a thread do servidor
    }
    
    public Conexão (Contato Meta, Chat Meio){                           //Montador, recolhe dados necessários para estabelecer a conexão
        this.Meta = Meta;                                               //Seta o contato
        this.Mensagem = null;                                           //Seta a mensagem como null, no início da conexão não há nenhuma mensagem disponível
        this.Meio = Meio;                                               //O meio existe e é uma classe tipo chat
        this.MServidor = null;                                           //Ainda não existe servidor
        CanalRecebe();                                                  //Dispara a thread do servidor
    }
        
    public String devolveNome (){                                   //Método que retorna o Nome
        return Meta.DevolveNome();                                     //Retorno do nome
    }
    
    public String devolveIP (){                                     //Método que retorna o IP
        return Meta.DevolveIP();                                       //Retorno do IP
    }
    
    public int devolvePorta (){                                     //Método que retorna a Porta
        return Meta.DevolvePorta();                                    //Retorno da Porta
    }
    
    public String DevolveMensagem () {                              //Método que retorna a Mensagem
        return Mensagem;                                                //Retorno da mensagem
    }
    
    public void colocaMensagem (String MensagemR){                  //Método que seta a mensagem, será útil de acordo que se recebem as mensagens
        this.Mensagem = MensagemR;                                      //Set da mensagem
    }
    
    public void RecebeMensagemTerminal (String MensagemR){                  //Método que recebe uma mensagem e mostra seu conteúdo no formato programado
        colocaMensagem(MensagemR);                                          //Guarda a última mensagem
        System.out.printf("%s diz: %s\n", Meta.DevolveNome(), Mensagem);    //Printa a mensagem
    }
    
    public void RecebeMensagemTextArea (String MensagemR){                  //Método que recebe uma mensagem e mostra seu conteúdo em um Text Area
        colocaMensagem(MensagemR);                                          //Guarda a última mensagem
        Meio.MostraMensagem(Mensagem);                                      //Mostra a mensagem no meio requisitado
    }
    
    public void EviarMensagem (String MensagemE){                   //Método para o envio de uma mensagem pela conexão
        Cliente Envio = new Cliente(MensagemE, this);               //Cria a thread para o envio do pacote proveniente da classe Enviar, ativa o runnable
        Envio.start();
    }

    public void CanalRecebe (){                                     //Método para o recebiento de mensagem pela conexão
        MServidor = new Servidor(this);                                 //Cria a thread com o caminho atual
        MServidor.start();
    }
    
    public void DesligaServidor (){                                 //Método que desliga a thread quando não ser mais necesária
        MServidor.stop();                                              //Para a thread
    }
}
